package br.com.guarana.business.service;

import br.com.guarana.business.model.Cidade;
import java.util.List;
import java.util.Vector;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

/**
 *
 * @author rogerio
 */
public class CidadeService extends PadraoService {

    public void salvar(Cidade cidade) {
        try {
            this.getDAO().getEntityManager().getTransaction().begin();
            this.getDAO().salvar(cidade);
            this.getDAO().getEntityManager().getTransaction().commit();
        } catch (Exception e) {
            RuntimeException myRuntime = new RuntimeException() {
                public String getMessage() {
                    return "Problema encontrado para cadastrar um Cidade.";
                }
            };
            throw myRuntime;
        }
    }

    public void excluir(Cidade cidade) {
        try {
            this.getDAO().getEntityManager().getTransaction().begin();
            this.getDAO().excluir(cidade);
            this.getDAO().getEntityManager().getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            this.getDAO().getEntityManager().getTransaction().rollback();
        }
    }

    public Cidade buscaCidadePorId(Integer id) {
        return (Cidade) this.getDAO().retornaObjeto(Cidade.class, id);
    }

    public Cidade buscaCidadePorComecoId(Integer idCidade) {
        String sFrase = "SELECT c.id FROM cidade c WHERE CAST(c.id AS character varying) LIKE '" + idCidade + "%'";
        Query query = this.getDAO().getEntityManager().createNativeQuery(sFrase);
        Cidade cidade = null;

        List listaSQL = query.getResultList();
        for (int i = 0; i < listaSQL.size(); i++) {

            Vector obj = (Vector) listaSQL.get(i);

            int id = ((Integer) obj.get(0));
            cidade = this.buscaCidadePorId(id);

        }
        return cidade;

    }

    public List<Cidade> buscaCidadePorEstado(String siglaEstado) {
        StringBuffer sFrase = new StringBuffer("SELECT c FROM Cidade c WHERE c.estado = :siglaEstado");
        Query query = this.getDAO().getEntityManager().createQuery(sFrase.toString());
        query.setParameter("siglaEstado", siglaEstado.toUpperCase().trim());
        List<Cidade> listaCidade = query.getResultList();
        return listaCidade;
    }

    public List<Cidade> buscaTodos() {
        StringBuffer sFrase = new StringBuffer("SELECT c FROM Cidade c ORDER BY c.estado,c.cidade ");
        Query query = this.getDAO().getEntityManager().createQuery(sFrase.toString());
        List<Cidade> listaCidade = query.getResultList();
        return listaCidade;
    }

    public Cidade buscaCidadePorNome(String nomeCidade){
        StringBuffer sFrase = new StringBuffer("SELECT o FROM Cidade o WHERE UPPER(o.cidade) LIKE '" + nomeCidade.toUpperCase().trim() + "'");
        Query query = this.getDAO().getEntityManager().createQuery(sFrase.toString());
        Cidade cidade = null;

        try {
            cidade = (Cidade) query.getSingleResult();
            return cidade;

        } catch (NonUniqueResultException e) {
            cidade = (Cidade) query.getResultList().get(0);
            return cidade;

        } catch (NoResultException e) {
            return null;
        }
    }
    
    /*
     * TESTES TESTES TESTES TESTES TESTES TESTES TESTES TESTES
     */
    public static void main(String[] args) {
       CidadeService main = new CidadeService();
       main.buscaTodos();
       main.buscaCidadePorEstado("SP");
       main.buscaCidadePorNome("BAURU");
    }
}
